/**
 * @param {number[]} nums
 * @param {number} target25
 * @return {number}
 * 算法循环的步骤选用什么？递归，for,while
 * 如何写递归：函数本身的内容就是循环体，而每次循环的变化值为参数，
 * 和for循环不同的是，for循环使用指针明显，适用于数组遍历，表示从某某取到某某为止，
 * 递归的坏处：排除特殊的情况，不需要循环的也得被迫循环，这样浪费执行时间（相较于for和while），
 * 当然也可以不写在方法体内，所以严格来说也不算坏处
 * 好处：适用于特殊的算法循环步骤，这种步骤for循环无法实现，即那种一次循环里需要下一次循环数据的那种，
 * （每次循环有未解决的东西是抽象的，无法用代码明确指出，需要下一次调用原函数来返回这个为解决的数据）
 * 再根据最后一次循环的结果依此返回来得到问题的结果，例如合并链表那道题的算法循环步骤
 * 特点：逐步缩小了问题的规模；必须由最后一次调用函数本身（即问题规模最小的时候）时结束调用并且逆向依
 * 次返回结果
 * while和for的区别呢：其实是一样的，for循环的第二个空和while的空都可以终止循环，
 * 只是for循环的第三个空空着不好看，所以普通的循环还是使用while吧
 * 
 * 总结：数组从某某取到某某用for循环，特殊的算法循环用递归，普通的循环用while即可
 */
console.log(searchInsert([1], 2)); //找到大于等于5的第一个值的下标

function searchInsert(nums, target, left = 0, right = nums.length - 1) {
    if (nums[nums.length - 1] < target) { return nums.length; }
    if (nums.length == 1) {
        return 0;
    }
    if (left == right) { return left; }

    var mid = parseInt((left + right) / 2);
    if (nums[mid] == target) {
        return mid;
    } else if (nums[mid] < target) {
        left = mid + 1;
        return searchInsert(nums, target, left, right); //递归注意：每个函数都是返回再次调用函数的结果吗，
        //这样才能把最后调用函数的结果逐个返回到第一个函数
    } else {
        right = mid;
        return searchInsert(nums, target, left, right);
    }
};